package beans;

import entidades.Usuario;
import excessoes.DAOException;
import excessoes.RNException;
import java.io.NotSerializableException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.util.DigestUtils;
import rn.UsuarioRN;
import util.ContextoUtil;
import util.FacesUtil;

/**
 *
 * @author Marcelo Gomes Neto
 */
/*
@ViewScoped = Instancia do bean é criada e mantida enquanto o usuário estiver na página (por exemplo, com os manipuladores de eventos ou Ajax). Deve implementar Serializable.  Sobrevive entre chamadas da mesma página.
@SessionScoped = Criado um por sessão de cada usuário. Sobrevive entre requests de páginas diferentes
@ApplicationScoped = Criado um para toda a aplicação.
@RequestScoped = Escopo padrão. É criado a cada requisição. 
 */
@ManagedBean(name="usuarioBean")
@SessionScoped
public class UsuarioBean implements Serializable
{
    private static final long serialVersionUID = 7424870818524615801L;
    private Usuario usuario = new Usuario();
    private List<Usuario> listarUsuarios;
    private Date dataAtual;
    private String confirmarSenha;
    private String senhaCriptografada;
    private List<SelectItem> postoGraduacao;
    private Boolean permiteAlterarSupervisor;
    private Boolean habilitaBotaoSalvar;
    private Boolean habilitaCampo;
    
    public void prepararAdicionarUsuario(ActionEvent actionEvent){
        this.usuario = new Usuario();
    }
    
    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getListarUsuarios() 
    {
        if(this.listarUsuarios == null) 
        {
            UsuarioRN usuarioRN = new UsuarioRN();
            this.setListarUsuarios(usuarioRN.listarUsuarios());
        }
        return listarUsuarios;
    }
    
    public void setListarUsuarios(List<Usuario> listarUsuarios) {
        this.listarUsuarios = listarUsuarios;
    }

    // Exibe a data atual no campo Data de Cadastramento ao incluir um novo usuário.
    public Date getDataAtual() 
    {
        this.dataAtual = new Date(System.currentTimeMillis());
        return dataAtual;
    }

    public void setDataAtual(Date dataAtual) {
        this.dataAtual = dataAtual;
    }

    public String getConfirmarSenha() {
        return confirmarSenha;
    }

    public void setConfirmarSenha(String confirmarSenha) {
        this.confirmarSenha = confirmarSenha;
    }
    
    public void ativoOk() throws DAOException, NotSerializableException, RNException, Exception
    {
        if (this.usuario.isAtivo()) {
            this.usuario.setAtivo(true);
            //FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuário ativado com sucesso!", ""));
        }
        else {
            this.usuario.setAtivo(false);
            //FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuário desativado com sucesso!", ""));
        }
        //Altera o usuário
        UsuarioRN usuarioRN = new UsuarioRN();
        usuarioRN.salvar(this.usuario);
        this.setListarUsuarios(usuarioRN.listarUsuarios());
        //return null;
    }
    
    public String editarUsuarioConvencional() throws DAOException, Exception 
    {
        ContextoBean contextoBean = ContextoUtil.getContextoBean();
        Integer id = contextoBean.getUsuarioLogado().getIdusuario();
        this.senhaCriptografada = contextoBean.getUsuarioLogado().getSenha();
        UsuarioRN usuarioRN = new UsuarioRN();
        this.setUsuario(usuarioRN.carregar(id));
        return "/restrito/usuario/usuario.xhtml";
    }
    
    public String editar() throws DAOException, Exception 
    {
        this.senhaCriptografada = this.usuario.getSenha();
        return "/restrito/usuario/usuario.xhtml";
    }
    
    public String voltarUsuarioConvencional() {
        return "/restrito/principal.xhtml";
    }
    
    public String salvar() throws Exception
    {
        try
        {
            ContextoBean contextoBean = ContextoUtil.getContextoBean();
            Usuario usuarioLogado = contextoBean.getUsuarioLogado();
            UsuarioRN usuarioRN = new UsuarioRN();
            String senha = this.usuario.getSenha();
            if (senha != null && senha.trim().length() > 0  && !senha.equals(this.confirmarSenha))
            {
                String msg = "Senha confirmada incorretamente!";
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, ""));
                return null;
            }
	
            if (senha != null && senha.trim().length() == 0) {
                this.usuario.setSenha(this.senhaCriptografada);
            } 
            else {
                String senhaCripto = DigestUtils.md5DigestAsHex(senha.getBytes());
                this.usuario.setSenha(senhaCripto);
            }
            // salva o usuário
            if (!usuarioLogado.getPermissao().equalsIgnoreCase("ROLE_ADMINISTRADOR")) {
                 usuarioRN.salvar(this.usuario);
                return "/restrito/usuario/usuario.xhtml";
            }
            else
            {
                usuarioRN.salvar(this.usuario);
                this.usuario = new Usuario();
                this.setListarUsuarios(usuarioRN.listarUsuarios());
                return "voltaTelaAnterior"; // Cofigurado em faces-config.xml
            }
        }
        catch (RuntimeException e) {
            if (e.getCause() instanceof ConstraintViolationException) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "O campo digitado já existe no banco de dados!", "O campo digitado já existe no banco de dados!"));
                //throw new RuntimeException("O campo digitado já existe no banco de dados!");
            }
        }
        return null;
    }
    
    public String excluir() throws RNException, DAOException, Exception
    {
        ContextoBean contextoBean = ContextoUtil.getContextoBean();
        Usuario usuarioLogado = contextoBean.getUsuarioLogado();
        String permissao = usuarioLogado.getPermissao();
        // exclui o usuário
        UsuarioRN usuarioRN = new UsuarioRN();
        if (!permissao.equals("ROLE_ADMINISTRADOR")) {
            String msg = "Exclusão não autorizada!";
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, msg, ""));
            return null;
        }
        usuarioRN.excluir(this.usuario, usuarioLogado);
        this.usuario = new Usuario();
        this.setListarUsuarios(usuarioRN.listarUsuarios());
        return null;
    }

    public String getSenhaCriptografada() {
        return senhaCriptografada;
    }

    public void setSenhaCriptografada(String senhaCriptografada) {
        this.senhaCriptografada = senhaCriptografada;
    }

    public List<SelectItem> getPostoGraduacao() 
    {
        if (this.postoGraduacao == null)
        {
            this.postoGraduacao = new ArrayList<>();
            //this.postoGraduacao.add(new SelectItem("MARECHAL", "Marechal"));
            this.postoGraduacao.add(new SelectItem("TBR", "Tenente Brigadeiro"));
            this.postoGraduacao.add(new SelectItem("MBR", "Major Brigadeiro"));
            this.postoGraduacao.add(new SelectItem("BR", "Brigadeiro"));
            this.postoGraduacao.add(new SelectItem("CEL", "Coronel"));
            this.postoGraduacao.add(new SelectItem("TCEL", "Tenente Coronel"));
            this.postoGraduacao.add(new SelectItem("MAJ", "Major"));
            this.postoGraduacao.add(new SelectItem("CAP", "Capitão"));
            this.postoGraduacao.add(new SelectItem("1T", "1º Tenente"));
            this.postoGraduacao.add(new SelectItem("2T", "2º Tenente"));
            this.postoGraduacao.add(new SelectItem("EST", "Estagiário"));
            this.postoGraduacao.add(new SelectItem("ASP", "Aspirante"));
            this.postoGraduacao.add(new SelectItem("AL", "Aluno"));
            this.postoGraduacao.add(new SelectItem("SO", "Sub-Oficial"));
            this.postoGraduacao.add(new SelectItem("1S", "1º Sargento"));
            this.postoGraduacao.add(new SelectItem("2S", "2º Sargento"));
            this.postoGraduacao.add(new SelectItem("3S", "3º Sargento"));
            this.postoGraduacao.add(new SelectItem("CB", "Cabo"));
            this.postoGraduacao.add(new SelectItem("TM", "Taifeiro-Mor"));
            this.postoGraduacao.add(new SelectItem("T1", "Taifeiro 1ª Classe"));
            this.postoGraduacao.add(new SelectItem("T2", "Taifeiro 2ª Classe"));
            this.postoGraduacao.add(new SelectItem("S1", "Soldado 1ª Classe"));
            this.postoGraduacao.add(new SelectItem("S2", "Soldado 2ª Classe"));
            this.postoGraduacao.add(new SelectItem("ASP", "Aspirante"));
            this.postoGraduacao.add(new SelectItem("SD", "Soldado"));
            this.postoGraduacao.add(new SelectItem("CV", "Civil"));
        }
        return postoGraduacao;
    }

    public void setPostoGraduacao(List<SelectItem> postoGraduacao) {
        this.postoGraduacao = postoGraduacao;
    }

    public Boolean getPermiteAlterarSupervisor() 
    {
        //ContextoBean contextoBean = ContextoUtil.getContextoBean();
        //Integer id = contextoBean.getUsuarioLogado().getIdusuario();
        //Não modificar!! Usado na tela usuario.xhtml para desabilitar os campos que não podem ser modificados no usuario supervisor
        Integer id = this.usuario.getIdusuario();
        if (id != 1) {
            this.setPermiteAlterarSupervisor(false);
        }
        else {
            this.setPermiteAlterarSupervisor(true);
        }
        return permiteAlterarSupervisor;
    }

    public void setPermiteAlterarSupervisor(Boolean permiteAlterarSupervisor) {
        this.permiteAlterarSupervisor = permiteAlterarSupervisor;
    }

    public Boolean getHabilitaBotaoSalvar() throws DAOException 
    {
        ContextoBean contextoBean = ContextoUtil.getContextoBean();
        String permissao = contextoBean.getUsuarioLogado().getPermissao();
        Integer id = this.usuario.getIdusuario();
        Integer idc = contextoBean.getUsuarioLogado().getIdusuario();

        if (permissao.equals("ROLE_ADMINISTRADOR") || idc.byteValue() == id.byteValue()) {
            this.setHabilitaBotaoSalvar(false);
        }
        else {
            this.setHabilitaBotaoSalvar(true);
        }
        return habilitaBotaoSalvar;
    }

    public void setHabilitaBotaoSalvar(Boolean habilitaBotaoSalvar) {
        this.habilitaBotaoSalvar = habilitaBotaoSalvar;
    }

    public Boolean getHabilitaCampo() 
    {
        ContextoBean contextoBean = ContextoUtil.getContextoBean();
        String permissao = contextoBean.getUsuarioLogado().getPermissao();

        if (permissao.equals("ROLE_ADMINISTRADOR")) {
            this.setHabilitaCampo(false);
        }
        else {
            this.setHabilitaCampo(true);
        }
        return habilitaCampo;
    }

    public void setHabilitaCampo(Boolean habilitaCampo) {
        this.habilitaCampo = habilitaCampo;
    }
}